|
|
@@ -5,6 +5,8 @@ module SortableEvents
|
5
|
5
|
validate :validate_events_order
|
6
|
6
|
end
|
7
|
7
|
|
|
8
|
+ EVENTS_ORDER_KEY = 'events_order'.freeze
|
|
9
|
+
|
8
|
10
|
def description_events_order(*args)
|
9
|
11
|
self.class.description_events_order(*args)
|
10
|
12
|
end
|
|
|
@@ -23,9 +25,9 @@ module SortableEvents
|
23
|
25
|
!can_order_created_events?
|
24
|
26
|
end
|
25
|
27
|
|
26
|
|
- def description_events_order(events = 'events created in each run')
|
|
28
|
+ def description_events_order(events = 'events created in each run', events_order_key = EVENTS_ORDER_KEY)
|
27
|
29
|
<<-MD.lstrip
|
28
|
|
- To specify the order of #{events}, set `events_order` to an array of sort keys, each of which looks like either `expression` or `[expression, type, descending]`, as described as follows:
|
|
30
|
+ To specify the order of #{events}, set `#{events_order_key}` to an array of sort keys, each of which looks like either `expression` or `[expression, type, descending]`, as described as follows:
|
29
|
31
|
|
30
|
32
|
* _expression_ is a Liquid template to generate a string to be used as sort key.
|
31
|
33
|
|
|
|
@@ -48,8 +50,8 @@ module SortableEvents
|
48
|
50
|
self.class.cannot_order_created_events?
|
49
|
51
|
end
|
50
|
52
|
|
51
|
|
- def events_order
|
52
|
|
- options['events_order']
|
|
53
|
+ def events_order(key = EVENTS_ORDER_KEY)
|
|
54
|
+ options[key]
|
53
|
55
|
end
|
54
|
56
|
|
55
|
57
|
module AutomaticSorter
|
|
|
@@ -102,8 +104,8 @@ module SortableEvents
|
102
|
104
|
}
|
103
|
105
|
EXPRESSION_TYPES = EXPRESSION_PARSER.keys.freeze
|
104
|
106
|
|
105
|
|
- def validate_events_order
|
106
|
|
- case order_by = events_order
|
|
107
|
+ def validate_events_order(events_order_key = EVENTS_ORDER_KEY)
|
|
108
|
+ case order_by = events_order(events_order_key)
|
107
|
109
|
when nil
|
108
|
110
|
when Array
|
109
|
111
|
# Each tuple may be either [expression, type, desc] or just
|
|
|
@@ -113,29 +115,29 @@ module SortableEvents
|
113
|
115
|
when String
|
114
|
116
|
# ok
|
115
|
117
|
else
|
116
|
|
- errors.add(:base, "first element of each events_order tuple must be a Liquid template")
|
|
118
|
+ errors.add(:base, "first element of each #{events_order_key} tuple must be a Liquid template")
|
117
|
119
|
break
|
118
|
120
|
end
|
119
|
121
|
case type
|
120
|
122
|
when nil, *EXPRESSION_TYPES
|
121
|
123
|
# ok
|
122
|
124
|
else
|
123
|
|
- errors.add(:base, "second element of each events_order tuple must be #{EXPRESSION_TYPES.to_sentence(last_word_connector: ' or ')}")
|
|
125
|
+ errors.add(:base, "second element of each #{events_order_key} tuple must be #{EXPRESSION_TYPES.to_sentence(last_word_connector: ' or ')}")
|
124
|
126
|
break
|
125
|
127
|
end
|
126
|
128
|
if !desc.nil? && boolify(desc).nil?
|
127
|
|
- errors.add(:base, "third element of each events_order tuple must be a boolean value")
|
|
129
|
+ errors.add(:base, "third element of each #{events_order_key} tuple must be a boolean value")
|
128
|
130
|
break
|
129
|
131
|
end
|
130
|
132
|
end
|
131
|
133
|
else
|
132
|
|
- errors.add(:base, "events_order must be an array of arrays")
|
|
134
|
+ errors.add(:base, "#{events_order_key} must be an array of arrays")
|
133
|
135
|
end
|
134
|
136
|
end
|
135
|
137
|
|
136
|
138
|
# Sort given events in order specified by the "events_order" option
|
137
|
|
- def sort_events(events)
|
138
|
|
- order_by = events_order.presence or
|
|
139
|
+ def sort_events(events, events_order_key = EVENTS_ORDER_KEY)
|
|
140
|
+ order_by = events_order(events_order_key).presence or
|
139
|
141
|
return events
|
140
|
142
|
|
141
|
143
|
orders = order_by.map { |_, _, desc = false| boolify(desc) }
|